# -*- codeing = utf-8 -*-
# Author: Redcomet
# QQ: 
# @Time: 2022/3/9 9:33
# @Author: Administrator
# @File: job.py
# @Desc:
import json
import jieba
from flask_marshmallow import Marshmallow
from base.core import db
from sqlalchemy import Column, Integer, String, Float, Text, ForeignKeyConstraint, DateTime

ma = Marshmallow()


class Job(db.Model):
    __tablename__ = 'tb_job2'  # 经过清洗后的招聘数据
    id = db.Column(db.Integer, autoincrement=True, primary_key=True)
    number = db.Column(db.String(255))
    company_name = db.Column(db.String(255))
    position_name = db.Column(db.String(255))
    city = db.Column(db.String(255))
    salary0 = db.Column(db.DECIMAL)
    salary1 = db.Column(db.DECIMAL)
    degree = db.Column(db.String(255))
    company_logo = db.Column(db.String(512))
    url = db.Column(db.String(255))
    company_url = db.Column(db.String(255))
    education = db.Column(db.String(255))
    coattr = db.Column(db.String(255))
    cosize0 = db.Column(db.DECIMAL)
    cosize1 = db.Column(db.DECIMAL)
    worktime0 = db.Column(db.DECIMAL)
    worktime1 = db.Column(db.DECIMAL)
    welfare = db.Column(db.String(255))
    publish_time = db.Column(db.String(255))
    province = db.Column(db.String(50))


class JobSchema(ma.Schema):
    class Meta:
        fields = ('id', 'number', 'company_name', 'position_name', 'city', 'salary0', 'salary1', \
                  'degree', 'company_logo', 'url', 'company_url', 'education', 'coattr', 'cosize0', \
                  'cosize1', 'worktime0', 'worktime1', 'welfare', 'publish_time', 'province')


job_schema = JobSchema(many=True)


def getWords():
    records = db.session.query(Job).limit(5000).all()
    text = ""
    for i in records:
        # print(i.intro)  # 每一行
        if i.welfare is not None:  # 需要修改词云分词的字段
            text = text + i.welfare

    word_count = dict()
    words = jieba.cut(text)
    for word in words:
        if word not in word_count:
            word_count[word] = 1
        else:
            word_count[word] += 1

    # 词频顺序进行排序，以元祖形式存储
    word_count_sorted = sorted(word_count.items(), key=lambda x: x[1], reverse=True)
    # print(word_count_sorted)

    # 过滤结果中的标点符号和单词
    word_count_sorted = filter(lambda x: len(x[0]) > 1, word_count_sorted)
    # print(word_count_sorted)

    # 元组转json
    result = json.dumps(dict(word_count_sorted), ensure_ascii=False)
    # result = json.dumps(dict(word_count_sorted), ensure_ascii=False)
    # print(json.loads(result))
    result = json.loads(result)
    return result


cityList = [
    {'province': '北京', 'city': ['北京市']},
    {'province': '天津', 'city': ['天津市']},
    {'province': '河北',
     'city': ['石家庄市', '唐山市', '秦皇岛市', '邯郸市', '邢台市', '保定市', '张家口市', '承德市', '沧州市', '廊坊市',
              '衡水市']},
    {'province': '山西',
     'city': ['太原市', '大同市', '阳泉市', '长治市', '晋城市', '朔州市', '晋中市', '运城市', '忻州市', '临汾市',
              '吕梁市']},
    {'province': '内蒙古自治区',
     'city': ['呼和浩特市', '包头市', '乌海市', '赤峰市', '通辽市', '鄂尔多斯市', '呼伦贝尔市', '巴彦淖尔市',
              '乌兰察布市', '兴安盟', '锡林郭勒盟', '阿拉善盟']},
    {'province': '辽宁',
     'city': ['沈阳市', '大连市', '鞍山市', '抚顺市', '本溪市', '丹东市', '锦州市', '营口市', '阜新市', '辽阳市',
              '盘锦市', '铁岭市', '朝阳市', '葫芦岛市']},
    {'province': '吉林',
     'city': ['长春市', '吉林市', '四平市', '辽源市', '通化市', '白山市', '松原市', '白城市', '延吉市']},
    {'province': '黑龙江',
     'city': ['哈尔滨市', '齐齐哈尔市', '鸡西市', '鹤岗市', '双鸭山市', '大庆市', '伊春市', '佳木斯市', '七台河市',
              '牡丹江市', '黑河市', '绥化市',
              '大兴安岭地区']},
    {'province': '上海', 'city': ['上海市']},
    {'province': '江苏',
     'city': ['南京市', '无锡市', '徐州市', '常州市', '苏州市', '南通市', '连云港市', '淮安市', '盐城市', '扬州市',
              '镇江市', '泰州市', '宿迁市']},
    {'province': '浙江',
     'city': ['杭州市', '宁波市', '温州市', '嘉兴市', '湖州市', '绍兴市', '金华市', '衢州市', '舟山市', '台州市',
              '丽水市']},
    {'province': '安徽',
     'city': ['合肥市', '芜湖市', '蚌埠市', '淮南市', '马鞍山市', '淮北市', '铜陵市', '安庆市', '黄山市', '滁州市',
              '阜阳市', '宿州市', '六安市', '亳州市',
              '巢湖市', '池州市', '宣城市']},
    {'province': '福建',
     'city': ['福州市', '厦门市', '莆田市', '三明市', '泉州市', '漳州市', '南平市', '龙岩市', '宁德市']},
    {'province': '江西',
     'city': ['南昌市', '景德镇市', '萍乡市', '新余市', '九江市', '鹰潭市', '赣州市', '吉安市', '宜春市', '抚州市',
              '上饶市']},
    {'province': '山东',
     'city': ['济南市', '青岛市', '淄博市', '枣庄市', '东营市', '烟台市', '潍坊市', '济宁市', '泰安市', '威海市',
              '日照市', '莱芜市', '临沂市', '德州市',
              '聊城市', '滨州市', '荷泽市']},
    {'province': '河南',
     'city': ['郑州市', '开封市', '洛阳市', '平顶山市', '安阳市', '鹤壁市', '新乡市', '焦作市', '济源市', '濮阳市',
              '许昌市', '漯河市', '三门峡市', '南阳市',
              '商丘市', '信阳市', '周口市', '驻马店市']},
    {'province': '湖北',
     'city': ['武汉市', '黄石市', '十堰市', '宜昌市', '襄阳市', '荆州市', '荆门市', '鄂州市', '孝感市', '黄冈市',
              '咸宁市', '随州市', '恩施市', '仙桃市',
              '天门市', '潜江市', '神农架林区']},
    {'province': '湖南',
     'city': ['长沙市', '株洲市', '湘潭市', '衡阳市', '邵阳市', '岳阳市', '常德市', '张家界市', '益阳市', '郴州市',
              '永州市', '怀化市', '娄底市', '吉首市', '湘西']},
    {'province': '广东',
     'city': ['广州市', '韶关市', '深圳市', '珠海市', '汕头市', '佛山市', '江门市', '湛江市', '茂名市', '肇庆市',
              '惠州市', '梅州市', '汕尾市', '河源市',
              '阳江市', '清远市', '东莞市', '中山市', '东沙群岛', '潮州市', '揭阳市', '云浮市']},
    {'province': '广西',
     'city': ['南宁市', '柳州市', '桂林市', '梧州市', '北海市', '钦州市', '贵港市', '玉林市', '百色市', '贺州市',
              '河池市', '来宾市', '崇左市', '防城港市']},
    {'province': '海南',
     'city': ['海口市', '三亚市', '三沙市', '五指山市', '琼海市', '儋州市', '文昌市', '万宁市', '东方市', '安定县',
              '屯昌县', '澄迈县', '临高县', '白沙',
              '昌江', '乐东', '陵水', '保亭', '琼中']},
    {'province': '重庆', 'city': ['重庆市']},
    {'province': '四川',
     'city': ['成都市', '自贡市', '攀枝花市', '泸州市', '德阳市', '绵阳市', '广元市', '遂宁市', '内江市', '乐山市',
              '南充市', '眉山市', '宜宾市', '广安市',
              '达州市', '雅安市', '巴中市', '资阳市', '阿坝', '甘孜', '凉山', ]},
    {'province': '贵州',
     'city': ['贵阳市', '六盘水市', '遵义市', '安顺市', '铜仁市', '黔西南', '毕节市', '黔东南', '黔南']},
    {'province': '云南',
     'city': ['昆明市', '曲靖市', '玉溪市', '保山市', '昭通市', '丽江市', '普洱市', '临沧市', '楚雄', '文山',
              '西双版纳', '大理', '德宏', '怒江', '迪庆']},
    {'province': '西藏', 'city': ['拉萨市', '昌都地区', '山南地区', '日喀则地区', '那曲地区', '阿里地区', '林芝地区']},
    {'province': '陕西',
     'city': ['西安市', '铜川市', '宝鸡市', '咸阳市', '渭南市', '延安市', '汉中市', '榆林市', '安康市', '商洛市']},
    {'province': '甘肃',
     'city': ['兰州市', '嘉峪关市', '金昌市', '白银市', '天水市', '武威市', '张掖市', '平凉市', '酒泉市', '庆阳市',
              '定西市', '陇南市', '临夏', '甘南']},
    {'province': '青海', 'city': ['西宁市', '海乐市', '海北', '黄南', '海南', '果洛', '玉树', '海西']},
    {'province': '宁夏', 'city': ['银川市', '石嘴山市', '吴忠市', '固原市', '中卫市', ]},
    {'province': '新疆',
     'city': ['乌鲁木齐市', '克拉玛依市', '吐鲁番地区', '哈密地区', '昌吉', '博尔塔拉', '巴音郭楞', '阿克苏地区',
              '克孜勒苏柯尔克孜自治州', '喀什地区', '和田地区', '伊犁',
              '塔城地区', '阿勒泰地区', '石河子市', '阿拉尔地区', '图木舒克市', '五家渠市', ]},
    {'province': '台湾',
     'city': ['台北市', '高雄市', '台南市', '台中市', '金门县', '南投县', '基隆市', '新竹市', '嘉义市', '新北市',
              '宜兰县', '新竹县', '桃园县', '苗粟县',
              '彰化县', '嘉义县', '云林县', '屏东县', '台东县', '花莲县', '澎湖县', '连江县']},
    {'province': '香港', 'city': ['香港岛', '新界']},
    {'province': '澳门', 'city': ['澳门', '离岛']},
]
#题目模型类
class TbItem(db.Model):
    __tablename__ = 'tb_item'

    id = Column(Integer, primary_key=True, autoincrement=True)
    type = Column(String(50), nullable=False)  # 题型
    title = Column(String(255), nullable=False)  # 题目标题
    content = Column(Text, nullable=False)  # 试题内容
    source_year = Column(Integer, nullable=False)  # 来源年份
    difficulty = Column(Float, default=0.5)  # 题目难度
    score_avg = Column(Float, default=0)  # 平均得分
    click_count = Column(Integer, default=0)  # 点击次数
    visit_count = Column(Integer, default=0)  # 访问次数
    pdf_url = Column(String(255))  # PDF 链接
    knowledge_points = Column(String(255), default=None)  # 知识点
    vocabulary_level = Column(Integer, default=1)  # 词汇难度
    sentence_complexity = Column(Float, default=0.5)  # 句子复杂度
    topic_category = Column(String(50), default='通用')  # 主题分类


#用户个性化推荐TbRate模型类
class TbRate(db.Model):
    __tablename__ = 'tb_rate'

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    uid = db.Column(db.Integer, db.ForeignKey('tb_user.id'), nullable=False)  # 外键：tb_user
    iid = db.Column(db.Integer, db.ForeignKey('tb_item.id'), nullable=False)  # 外键：tb_item
    rate = db.Column(db.Float(3, 2), nullable=False)  # 用户评分
    time_spent = db.Column(db.Integer, nullable=False)  # 答题耗时（秒）
    correctness = db.Column(db.Integer, nullable=False)  # 答题正确性（0 错误/1 正确）
    difficulty_perception = db.Column(db.Float(2, 1))  # 用户感知难度（1-5）
    attempt_count = db.Column(db.Integer, default=1)  # 尝试次数
    last_attempt_time = db.Column(db.DateTime, nullable=False)  # 最后答题时间
    feedback_text = db.Column(db.Text)  # 用户反馈文本
    is_favorite = db.Column(db.Integer, default=0)  # 是否收藏

    # 外键关系
    user = db.relationship('User', backref=db.backref('rates', lazy=True))
    item = db.relationship('TbItem', backref=db.backref('rates', lazy=True))

    def __repr__(self):
        return f"<TbRate(uid={self.uid}, iid={self.iid}, rate={self.rate})>"

#用户个性化推荐TbUserFeature模型类
class TbUserFeature(db.Model):
    __tablename__ = 'tb_user_feature'

    uid = db.Column(db.Integer, primary_key=True)  # 设置主键
    english_level = db.Column(db.String(20))
    target_score = db.Column(db.Integer)
    weak_type = db.Column(db.String(50))
    study_habit = db.Column(db.String(20))
    device_type = db.Column(db.String(20))
    update_time = db.Column(db.DateTime)

    def __repr__(self):
        return f"<TbUserFeature(uid={self.uid}, english_level={self.english_level})>"

#真题题库
class TbExamPaper(db.Model):
    __tablename__ = 'tb_exampapers'

    id = db.Column(db.Integer, primary_key=True, autoincrement=True, comment='主键ID')
    title = db.Column(db.String(255), nullable=False, comment='试卷标题')
    year = db.Column(db.Integer, nullable=False, comment='试卷年份')
    papers_file_path = db.Column(db.String(500), nullable=False, comment='真题PDF文件路径')
    answer_file_path = db.Column(db.String(500), nullable=True, comment='答案PDF文件路径')
    created_at = db.Column(db.DateTime, server_default=db.func.current_timestamp(), comment='创建时间')
    updated_at = db.Column(db.DateTime, server_default=db.func.current_timestamp(), onupdate=db.func.current_timestamp(), comment='更新时间')

    def __repr__(self):
        return f"<TbExamPaper(id={self.id}, title='{self.title}', year={self.year})>"

class TbExamPaperSchema(ma.SQLAlchemyAutoSchema):
    class Meta:
        model = TbExamPaper
        load_instance = True

job_schema = TbExamPaperSchema(many=True)  # 注意 many=True


class Review(db.Model):
    __tablename__ = 'review'

    id = db.Column(db.Integer, primary_key=True)
    word = db.Column(db.String(50), nullable=False)#英文单词
    total_num = db.Column(db.Integer, default=0)#复习总次数
    forget_num = db.Column(db.Integer, default=0)#忘记次数
    rate = db.Column(db.Float, default=-1, nullable=False)#单词遗忘率
    LIST = db.Column(db.Integer, default=0)
    UNIT = db.Column(db.Integer, default=0)
    INDEX = db.Column(db.Integer, default=0)
    BOOK = db.Column(db.String(20), default='')
    history = db.Column(db.String(100), default='') # 记忆历史
    flag = db.Column(db.Integer, default=0)

class ReviewSchema(ma.SQLAlchemyAutoSchema):
    class Meta:
        model = Review
        load_instance = True
        sqla_session = db.session
        fields = ('id', 'word', 'total_num', 'forget_num', 'rate',
                  'LIST', 'UNIT', 'INDEX', 'BOOK', 'flag')

review_schema = ReviewSchema()
reviews_schema = ReviewSchema(many=True)
